﻿#pragma once
#include <QObject>
#include <QMap>
#include "netDataManager.h"
#include "NetInfo.h"

class QTcpSocket;
class QTcpServer;
class NetUser;
class NetPack;

class NetServer : public QObject {
	Q_OBJECT

public:
	NetServer(QObject * parent = NULL);
	~NetServer();
	
	/*功能: 启动服务器
	  输入参数port: 服务器端口
	  返回参数  是否成功
	*/
	bool startServer(int port);
	
	/*功能:关闭服务器
	*/
	void stopServer();
	
	/*功能:是否启动
	*/
	bool isOpen();	

	/*功能:获得网络信息
	*/
	NetInfo netInfo(int netId);
	
	/*功能:断开连接
	*/
    void closeConnect(int netId);	

	/*功能: 发送数据包到指定客户端
	  输入参数netId: 客户端编号
	  输入参数pack: 数据包
	  返回参数  是否成功
	*/
	bool sendPack(int netId,const NetPack &pack);
	
	/*功能: 发送数据包到客户端，排除指定的
	  输入参数netId: 客户端编号
	  输入参数pack: 数据包
	  返回参数  是否成功
	*/
	bool sendPackExclude(int netId, const NetPack &pack);
	
	/*功能: 发送数据包到所有客户端
	  输入参数pack: 数据包
	  返回参数  是否成功
	*/
	bool sendPackToAll(const NetPack &pack);

signals:	
	/*功能: 新的连接
	  输入参数netId: 网络id
	*/
	void newConnect(int netId);
	/*功能: 连接断开
	  输入参数netId: 网络id
	*/
	void disConnect(int netId);
	/*功能: 接收到新数据
	  输入参数 netId: 网络id
	  输入参数 ptr:   网络数据包
	*/
	void newDataRecv(int netId,NetPackPtr ptr);

private slots:
	void onNewConnect();
	void onReadyRead();
	void onDisconnected();

private:	
	void closeSocket(int netId);
	
	QTcpServer *tcpServer;					
	QMap<int, QTcpSocket*> m_tcpClients;

	int m_netId;
	NetDataManager m_dataManager;
};
